# -*- coding: utf-8 -*-
# Create your views here.
from buscador.forms import ExpertoBuscarForm
from datos_taxonomicos.models import Dato, Especie
from detalles_especie.models import DetalleEspecie
from detalles_region.models import DetalleRegion
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.context_processors import csrf
from django.db.models.query_utils import Q
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from django.template.context import RequestContext
from django.views.generic.create_update import update_object, create_object, \
    delete_object
from django.views.generic.list_detail import object_list, object_detail
from documentos.models import Documento
from expertos.forms import ExpertoForm, ExpertoUsuarioForm, \
    ExpertoUsuarioSinForm
from expertos.models import Experto
from instituciones.models import Institucion
from proyectos.models import Proyecto
from publicaciones.models import Publicacion
from userena.contrib.umessages.models import Message
from usuarios.models import Usuario
from usuarios.permisos import es_del_grupo_de_admins
from django.utils.safestring import mark_safe


def listar(request):    #seria la pagina de inicio para las expertos
    return object_list(request,
                       queryset = Experto.objects.all(),
                       allow_empty = True,
                       template_name = 'expertos/listar.html'
                       )
    
@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')    
def aprobar(request):    #seria la pagina de inicio para las expertos
    return object_list(request,
                       queryset = Usuario.objects.filter(registrarse_como_experto = True , experto = None),
                       allow_empty = True,
                       template_name = 'expertos/aprobar.html'
                       )
    
    
@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')    
def aprobar_confirmar(request,user_id):    #seria la pagina de inicio para las expertos
    c = {}
    user = get_object_or_404(Usuario,pk=user_id)
    c.update(csrf(request))
    c.update({'user':user})
    return render_to_response('expertos/aprobar_confirmar.html',c,context_instance=RequestContext(request))


@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')    
def aprobar_confirmar_form(request,user_id):    #seria la pagina de inicio para las expertos
    c = {}
    user = get_object_or_404(Usuario,pk=user_id)
    c.update(csrf(request))
    c.update({'user':user})
    if request.method == 'POST':
        form = ExpertoUsuarioForm(request.POST)
        if form.is_valid():
            new_experto = form.save()
            c.update({'Experto':new_experto})
            c.update({'aviso' : ('Ha agregado un perfil de Experto al usuario: %s' % 
                                 str(user))})
            body = 'Su perfil de Experto ha sido aprobado! Ahora puede ingresar al sistema como Experto'
            Message.objects.send_message(request.user,
                                               [user.user],
                                               body)
            return render_to_response('expertos/detalle_aviso.html',c,context_instance=RequestContext(request))
        c.update({'form':form})
    else:
        form = ExpertoUsuarioForm(usuario = user)    
        c.update({'form':form})
        
    return render_to_response('expertos/form_aprobar.html',c,context_instance=RequestContext(request))



@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')    
def aprobar_confirmar_sin_form(request,user_id):    #seria la pagina de inicio para las expertos
    c = {}
    user = get_object_or_404(Usuario,pk=user_id)
    c.update(csrf(request))
    c.update({'user':user})
    try: 
        new_experto = Experto(usuario = user)
        new_experto.save()
        c.update({'Experto':new_experto})
        c.update({'aviso' : ('Ha agregado un perfil de Experto al usuario: %s' % 
                             str(user))})
        body = u'Perfil de Experto aprobado!'
        Message.objects.send_message(request.user,
                                           [user.user],
                                           body)
        return render_to_response('expertos/detalle_aviso.html',c,context_instance=RequestContext(request))
    except:
        c.update({'aviso' : (u'No se pudo agregar un perfil de Experto al usuario: %s' % 
                             str(user))})
        return render_to_response('expertos/detalle_aviso.html',c,context_instance=RequestContext(request))
    
    
def filtrar(request):    #seria la pagina de inicio para las especies
    form = ExpertoBuscarForm()
    q = None
    if request.method == 'POST':
        form = ExpertoBuscarForm(request.POST)
        if form.is_valid():
            q = Experto.objects
            if form.cleaned_data['nombre']:
                q = q.filter(nombre__icontains = form.cleaned_data['nombre'] )
            if form.cleaned_data['apellido']:
                q = q.filter(apellido__icontains = form.cleaned_data['apellido'] )
            if form.cleaned_data['campo']:
                q = q.filter(datos = form.cleaned_data['campo'] )
            if form.cleaned_data['pais']:
                q = q.filter(pais = form.cleaned_data['pais'] )
            if form.cleaned_data['institucion']:
                q = q.filter(instituciones = form.cleaned_data['institucion'] )
            if form.cleaned_data['linea']:
                q = q.filter(lineas_de_investigacion = form.cleaned_data['linea'] )
            if form.cleaned_data['proyecto']:
                q = q.filter(expertos_encargados = form.cleaned_data['proyecto'] )
            if q == Experto.objects:
                q = None
                
    return object_list(request,
                       queryset = Experto.objects.all(),
                       allow_empty = True,
                       extra_context = {'form' : form, 'expertos' : q },
                       template_name = 'expertos/filtrar.html'
                       )

@login_required
def ver(request, object_id):
    experto = get_object_or_404(Experto, pk=object_id)
    objetos_relacionados = {}
    #regiones = DetalleRegion.objects.filter(especie__datos = experto.datos)
    #objetos_relacionados.update({'regiones' : regiones })
    if experto:
        proyectos_encargados = Proyecto.objects.filter(encargados = experto)
        proyectos_involucrados = Proyecto.objects.filter(involucrados = experto)
        documentos = Documento.objects.filter(creador = experto)
        publicaciones = Publicacion.objects.filter(creador = experto)
        objetos_relacionados.update({'proyectos_encargados' : proyectos_encargados })
        objetos_relacionados.update({'proyectos_involucrados' : proyectos_involucrados })
        objetos_relacionados.update({'documentos' : documentos })
        objetos_relacionados.update({'publicaciones' : publicaciones })
    return object_detail(request,
                         queryset = Experto.objects.all(),
                         template_object_name =  "Experto",
                         extra_context = objetos_relacionados,
                         template_name = 'expertos/detalle.html',
                         object_id = object_id
                         ) 
        
@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')  
def crear(request):
    return create_object(request,
                         model = Experto,
                         form_class = ExpertoForm, 
                         template_name = 'expertos/crear.html', 
                         post_save_redirect = '/expertos/'
                         )     
@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')  
def editar(request, object_id):
    get_object_or_404(Experto, pk=object_id)
    return update_object(request,
                         model = Experto,
                         form_class = ExpertoForm,
                         template_name = 'expertos/editar.html', 
                         post_save_redirect = '/expertos/' + object_id,
                         object_id = object_id
                         )


@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')  
def eliminar(request, object_id):
    get_object_or_404(Experto, pk=object_id)
    return delete_object(request,
                         model = Experto, 
                         template_name = 'expertos/confirmar_eliminar.html', 
                         post_delete_redirect = '/expertos/',
                         object_id = object_id
                         )
